package com.polar.idea.agent;

import net.bytebuddy.asm.Advice;
import net.bytebuddy.implementation.bytecode.assign.Assigner;

import java.math.BigInteger;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPublicKey;

public class BigIntegerAdvice {


    private static BigInteger calculateFakeResult(X509Certificate userCertificate) {
        RSAPublicKey publicKey = (RSAPublicKey) userCertificate.getPublicKey();

        BigInteger x = new BigInteger(1, userCertificate.getSignature());

        return x.modPow(publicKey.getPublicExponent(), publicKey.getModulus());
    }

    @Advice.OnMethodEnter
    public static void intercept(@Advice.This Object x,
                                 @Advice.Argument(0) Object y,
                                 @Advice.Argument(1) Object z) {
        System.out.printf("开始校验 参数x:%s \n" +
                "参数y:%s \n" +
                "参数z:%s%n", x, y, z);
    }


    @Advice.OnMethodExit
    public static void intercept(
            @Advice.This Object x,
            @Advice.Argument(0) Object y,
            @Advice.Argument(1) Object z,
            @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object result) {
        System.out.printf("开始校验 参数x:%s \n" +
                "参数y:%s \n" +
                "参数z:%s%n", x, y, z);
        if (x.equals(new BigInteger("9502839683159454680243127993249823638038204242580045749711526269656671203688057755197633594571147083429893639625647962940552345508072042590182344120573349789133572149598404190417270679781652086809457296033876936919605603703011823739896633098086061110544367790834262400722159533449967771405849971708834547936844206448163405293290470978309448645779258835931679853191723658934330009908011730994852087412844994827554060390140119393297450171219949328154565747946995941103922571444171816774617108936220192006040294115576484768958184589717191556027773873634851507884305481545265293513744456419495814113647066008646128411480"))) {
            if (y.equals(new BigInteger("65537"))) {
                if (z.equals(new BigInteger("860106576952879101192782278876319243486072481962999610484027161162448933268423045647258145695082284265933019120714643752088997312766689988016808929265129401027490891810902278465065056686129972085119605237470899952751915070244375173428976413406363879128531449407795115913715863867259163957682164040613505040314747660800424242248055421184038777878268502955477482203711835548014501087778959157112423823275878824729132393281517778742463067583320091009916141454657614089600126948087954465055321987012989937065785013284988096504657892738536613208311013047138019418152103262155848541574327484510025594166239784429845180875774012229784878903603491426732347994359380330103328705981064044872334790365894924494923595382470094461546336020961505275530597716457288511366082299255537762891238136381924520749228412559219346777184174219999640906007205260040707839706131662149325151230558316068068139406816080119906833578907759960298749494098180107991752250725928647349597506532778539709852254478061194098069801549845163358315116260915270480057699929968468068015735162890213859113563672040630687357054902747438421559817252127187138838514773245413540030800888215961904267348727206110582505606182944023582459006406137831940959195566364811905585377246353"))) {
                    result = new BigInteger("986236757547332986472011617696226561292849812918563355472727826767720188564083584387121625107510786855734801053524719833194566624465665316622563244215340671405971599343902468620306327831715457360719532421388780770165778156818229863337344187575566725786793391480600129482653072861971002459947277805295727097226389568776499707662505334062639449916265137796823793276300221537201727072401742985542559596685092673521228140822200236743113743661549252453726123450722876929538747702356573783116366629850199080495560991841329893037291900147497007197055572787780928474439121421603795953045312843947313178740002047535489433");
                }
            }
        }
    }

}
